#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;

/*HJJ QQ479287006
 给定一个字符串 queryIP。如果是有效的 IPv4 地址，返回 "IPv4" ；如果是有效的 IPv6 地址，返回 "IPv6" ；如果不是上述类型的 IP 地址，返回 "Neither" 。

有效的IPv4地址 是 “x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。例如: “192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址， “192.168.01.1” 为无效IPv4地址; “192.168.1.00” 、 “192.168@1.1” 为无效IPv4地址。

一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址，其中:

1 <= xi.length <= 4
xi 是一个 十六进制字符串 ，可以包含数字、小写英文字母( 'a' 到 'f' )和大写英文字母( 'A' 到 'F' )。
在 xi 中允许前导零。
例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334" 和 "2001:db8:85a3:0:0:8A2E:0370:7334" 是有效的 IPv6 地址，而 "2001:0db8:85a3::8A2E:037j:7334" 和 "02001:0db8:85a3:0000:0000:8a2e:0370:7334" 是无效的 IPv6 地址。*
 * */
class Solution {
public:

    string checkIp4(string &ip) {

        ip.push_back('.');
        int index = 0;
        int count = 0;
        while ((index = ip.find_first_of(".")) != -1) {
            // index++;
            string t = ip.substr(0, index);
            if (t.size() == 0)
                return "Neither";
            int sizer = 0;
            while (sizer < t.size()) {
                if (t[sizer] < '0' || t[sizer] > '9')
                    return "Neither";
                sizer++;
            }

            if (sizer > 1 && t[0] == '0')
                return "Neither";

            if (sizer > 3 || t.compare("255") > 0)
                return "Neither";

            ip.erase(0, sizer + 1);
            count++;
        }

        if (count != 4)
            return "Neither";

        return "IPv4";

    }

    string checkIpv6(string &ip) {

        ip.push_back(':');
        int index = 0;
        int count = 0;
        while ((index = ip.find_first_of(":")) != -1) {
            string t = ip.substr(0, index);

            if (t.size() == 0)
                return "Neither";

            int sizer = 0;
            while (sizer < t.size()) {
                if ((t[sizer] >= '0' && t[sizer] <= '9') || (t[sizer] >= 'a' && t[sizer] <= 'f') ||
                    (t[sizer] >= 'A' && t[sizer] <= 'F'))
                    sizer++;
                else
                    return "Neither";
            }

            if (sizer >= 5)
                return "Neither";
            ip.erase(0, sizer + 1);
            count++;
        }


        if (count != 8)
            return "Neither";
        return "IPv6";


    }

    string validIPAddress(string queryIP) {

        if (queryIP.size() == 0 || queryIP[queryIP.size() - 1] == '.' || queryIP[queryIP.size() - 1] == ':' ||
            queryIP.size() < 7)
            return "Neither";

        if (queryIP.find_last_of(":") != -1) {
            return checkIpv6(queryIP);
        } else {
            return checkIp4(queryIP);
        }


        return "";
    }

};







